#include "managercontroller.h"
#include "../dao/userdao.h"
#include "../dao/organizationdao.h"
#include "../dao/approveexam.h"
#include "../dao/windowdao.h"
#include "../poco/user.h"
#include "../poco/organizationInfo.h"
#include"../dao/saledao.h"
#include <QDebug>

ManagerController::ManagerController()
{

}

bool ManagerController::login(User &user)
{
    if(user.phone.length() == 0 || user.password.length()== 0)  //先简单判断是否为空
        return false;

    string passwd_old = user.password;

    UserDao db;
    bool ret = db.getUser(user);

    if(!ret)
        return false;
    if(passwd_old != user.password)  //判断用户密码输入是否正确
        return false;
    if(user.type != User::TYPE_administrator)  //判断用户类型
    {
        qDebug()<<"用户类型出错";
        return false;
    }

    this->user = user;  //存储user信息

    OrganizationDao orgdao;
    vector<OrganizationInfo> orgs=orgdao.selectOrg(user);
    if(orgs.size()>0)
        this->orginfo = orgdao.selectOrg(user)[0];

    return true;
}

bool ManagerController::registerUser(User &user, OrganizationInfo &org)
{
    UserDao db;
    User user_test;
    bool ret0 = db.getUser(user_test);
    if(user_test.phone==user.phone)  //存在用户则无法注册
        return false;

    /*判断用户输入的信息的合法性*/
    //电话号码的长度必须为11位
    if ( user.phone.length() != 11 ){
        qDebug()<< "电话号码的长度必须为11位!!!";
        return false;
    }

    //判断输入是否只有数字
    for(auto i = user.phone.begin(); i != user.phone.end(); i++){
        if ( *(i) < 48 || *(i) > 57 ){
            qDebug()<< "电话只能有数字!!!";
            return false;
        }
    }

    //确定是否是管理员
    if ( user.type != User::TYPE_administrator ){
        qDebug()<< "用户类型不是管理员!!!";
        return false;
    }

    //身份证号的长度必须为18位
    if ( user.identityCard.length() != 18 ){
        qDebug()<< "身份证号的长度必须为18位";
        return false;
    }

    //判断输入是否只有数字或X,x
    for(auto i = user.identityCard.begin(); i != user.identityCard.end(); i++){
        if ( *(i) != 88 && *(i) != 120 && (*(i) < 48 || *(i) > 57) ){
            qDebug()<< "身份证输入是否只有数字或X,x";
            return false;
        }
        if ( *(i) == 120 ){
            *(i) -= 32;
        }
    }

    //确定性别输入是否正确
    if ( user.sex != "M" && user.sex != "F" && user.sex != "m" && user.sex != "f"){
        qDebug()<<"性别输入位M/m/F/f";
        return false;
    }
    if ( user.sex == "m"){
        user.sex = "M";
    }
    if ( user.sex == "f"){
        user.sex = "F";
    }

    //判断输入是否只有数字
    for(auto i = user.creditCard.begin(); i != user.creditCard.end(); i++){
        if ( *(i) < 48 || *(i) > 57 ){
            qDebug()<< "银行卡只有数字";
            return false;
        }
    }


    OrganizationDao db1;
    OrganizationInfo org_test = org;
    vector<OrganizationInfo> vec = db1.selectAll();
    vector<OrganizationInfo>::iterator it;
    for (it = vec.begin(); it != vec.end(); it++){
        if(*(it) == org_test){
            qDebug()<<"已经存在该组织，该组织已经有管理员";
            return false;
        }
    }

    //程序运行到此处说明各项检查均通过，可以进行注册
    bool ret = db.insertUser(user);  //开始注册
    if(!ret)
        return false;

    //添加该组织
    db1.addOrg(org);

    //将管理员和组织进行对应
    ApproveExam db2;
    bool ret1 = db2.addJionExam(user,org);
    if(!ret1)
        return false;
    return true;

}

bool ManagerController::addWindow(WindowInfo& win)
{

    WindowDao wd;
    WindowInfo win_test = win;
    vector<WindowInfo> vec = wd.selectOrgWindow(this->orginfo);
    vector<WindowInfo>::iterator it;
    for(it = vec.begin(); it != vec.end(); it++){
        if (*(it) == win_test){
            qDebug()<<"该组织已经存在该窗口，禁止重复添加";
            return false;
        }
    }
    win.status=WindowInfo::STATUS_spare;//状态初始为空闲状态
    bool ret = wd.insertWindow(win);
    if(!ret)
        return false;

    return true;

}

//审批加盟申请
bool ManagerController::examJoin(int exam_id, int status)
{
    ApproveExam aed;
    bool ret = aed.alterJionExam(exam_id, status);
    if(!ret)
        return false;
    return true;
}

//查询组织下的所有待审批的加盟申请对应的用户，调用approveExam中的同名函数即可
bool ManagerController::selectOrgJoin(vector<User>& users,vector<int> &exam_ids)
{
    ApproveExam ae;
    users.clear();
    exam_ids.clear();
    return ae.selectOrgJoin(orginfo,users,exam_ids);
}

//窗口申请的信息查询,调用approveExam中的同名函数即可
 bool ManagerController::selectOrgExamWindow(vector<WindowInfo>& wins,vector<User>& users,vector<int>& exam_ids)
 {
    ApproveExam ae;
    wins.clear();
    users.clear();
    exam_ids.clear();
    return ae.selectOrgExamWindow(orginfo,wins,users,exam_ids);
 }

//商家开窗口申请审批，调用ApproveExam中的窗口审批状态修改函数alterWindowExam，
 //更改exam_id对应审批的窗口在windowInfo表中的状态(status)信息，（若状态为审批通过，则窗口为运营态，否则为空闲态
bool ManagerController::examWindow(int exam_id,WindowInfo win,int status)
{
    ApproveExam ae;
    //status:0表示不通过，1表示通过
    ae.alterWindowExam(exam_id,status);
    //修改窗口状态
    if(status==ApproveExam::STATU_PASS)
    {
        win.status=WindowInfo::STATUS_onSale;//修改为在售
    }
    else
    {
        win.status=WindowInfo::STATUS_spare;//等待商家选择，空闲中
    }
    WindowDao wd;
    wd.alterWindow(win);
    return true;
}

//查询组织下的所有审批的菜品,调用approveExam中的同名函数即可
bool ManagerController::selectOrgExamFood(vector<SaleBase*>& sales,vector<WindowInfo>& wins)
{
    ApproveExam ae;
    sales.clear();
    wins.clear();
    ae.selectOrgExamFood(orginfo,sales);
    WindowDao wd;
    for(auto sa:sales)
    {
        WindowInfo win;
        win.id=sa->window_id;
        wd.selectWindow(win);
        wins.push_back(win);
    }
    return true;
}

//菜品审批，相当于修改表中的status值，调用saleDao中的同名函数
bool ManagerController::examFood(SaleBase* sale,int status)
{
    SaleDao sd;
    return sd.examFood(sale,status);
}
